home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Hamurabi 1.1.1 / Hamurabi.c < prev    next >
Text File  |  1996-07-07  |  11KB  |  395 lines

  1. /* ----------------------------------------------------------------------
  2.  
  3.     Hamurabi
  4.     version 1.1.1
  5.     
  6.     Original author: David Ahl
  7.     Converted to C by: Dave Menconi
  8.     Converted to CW by: Paul Celestin
  9.     
  10.     940630 - 1.0.0 - first version ported to CW6
  11.     951215 - 1.1.0 - updated for CW7
  12.     960704 - 1.1.1 - updated for CW9, fixed calculation bug
  13.  
  14. ---------------------------------------------------------------------- */
  15.  
  16. #include "Stdio.h"
  17. #include "stdlib.h"
  18. #include "Hamurabi.h"
  19.  
  20. #define AO 0 /* if set, use artificial opponent instead of player */
  21.  
  22. /* Global Variables */
  23. int Year, /* position in the 10 year cycle */
  24.     People, /* number of people in country */
  25.     StoredGrain, /* Grain in storage */
  26.     Impeached = 0, /* was player impeached for starving his people? */ 
  27.     TotalDeath = 0, /* total death from all causes */
  28.     AvgStarve = 0, /* avg number of people who starved per year */
  29.     Land;/* land owned */
  30. int quit = False,
  31.     starved, /* number of people starved */
  32.     newbies, /* number of new people */
  33.     yield, /* bushels of grain per acre */
  34.     lostgrain, /* bushels eaten by rats */
  35.     landcost, /* cost of land */
  36.     peoplefed, /* people fed */
  37.     farmers, /* people needed to tend land */
  38.     landtraded, /* amount of land traded */
  39.     harvest, /* bushels harvested */
  40.     feedgrain, /* amount of grain fed to the people */
  41.     plantacre,
  42.     plantgrain;/* amount of grain used for seed */
  43.  
  44. /* Support Routines */
  45. void InitMac(void)
  46. {
  47. /*    InitGraf(&thePort);
  48.     InitFonts();
  49.     InitWindows();*/
  50.     /*InitDialogs(-1);*/
  51. /*    OpenPort(&MyPort);
  52.     SetPort(&MyPort);
  53.  
  54.     InitCursor();
  55. */
  56. }
  57. void InitGame(void)
  58. {
  59.     People = INITPEOPLE;
  60.     Land = INITLAND;
  61.     StoredGrain = INITSTORED;
  62.     starved = INITSTARVED;
  63.     newbies = INITNEWBIES;
  64.     yield = INITYIELD;
  65.     lostgrain = INITRATS;
  66.  
  67. }/* Initialize */
  68. /* ============= */
  69. int CalcStarved(int grain)
  70. /* Calculate and return the number of people who will starve 
  71.  given the number of people (a global) and the amount of grain.*/
  72.  int starved = 0;
  73.  
  74.  if ((starved = People - grain / GRAINperMAN) > 0)
  75.   return starved;
  76.  else
  77.   return 0;
  78. }
  79. /* ============= */
  80. int CalcHarvest(int seed, int yield, int farmers)
  81. /* Calculate and return the amount of food havested given the 
  82.     amount of land, the amount of seed and the number of people */
  83. {
  84.     int landseeded,landfarmed,Growing;
  85.  
  86.     landseeded = seed*ACREperGRAIN;
  87.     landfarmed = farmers*ACREperFARMER;
  88. /* now we need to find the smallest of land, landseeded, and landfarmed */
  89.     Growing = min(min(landseeded,landfarmed),Land);
  90. /* now we simply return the amount of grain */
  91.     return yield * Growing;
  92. }/* CalcHarvest */
  93. /* ============= */
  94. int CalcLostGrain(void)
  95. /* determine amount of spoilage from all causes */
  96. {
  97.     int rnd;
  98.     
  99.     rnd = RandRng(RNGLOST);
  100.     if ((rnd == 2) || (rnd == 4)) /* following original Ham*/
  101.         return StoredGrain/rnd;
  102.     else
  103.         return 0;
  104. }/* CalcLostGrain */
  105. /* ============= */
  106. int CalcLandPrice(void)
  107. /* this routine calculates the price of land */
  108. {
  109.     return RandRng(RNGLANDPRICE)+ADDLANDPRICE;
  110. }/* CalcLandPrice */
  111. /* ============= */
  112. int CalcYield(void)
  113. /* this routine calculates the amount of grain that you get for one acre of land
  114.  */
  115. {
  116.     return RandRng(RNGYIELD)+ADDYIELD;
  117. }/* CalcYield */
  118. /* ============= */
  119. int CalcNewbies(void)
  120. /* this routine calcs the amount of population growth */
  121. {
  122. long temp,temp1,temp2,Rand;
  123.  
  124.     Rand = RandRng(RNGNEWBIE)  ;
  125.     temp1 = (long) Land * LANDATTRACT;
  126.     temp2 = (long) StoredGrain * GRAINATTRACT;
  127.     temp = ((temp1+temp2)*Rand)/People/100 +1;
  128.     return temp;
  129. }/* CalcNewbie */
  130. /* ============= */
  131. void RandomEvent(void)
  132. /* this routine determines what, if any random events happen this 
  133.     turn and adjusts the global values appropriately */
  134. {
  135.         lostgrain = CalcLostGrain();
  136.         StoredGrain -= lostgrain;
  137.         if (RandRng(100)<=PLAGUECHANCE)
  138.         {
  139.             printf("\nA horrible plague struck!! Half the people died!\n");
  140.             People  /= 2;
  141.         }
  142. }
  143. /* ============= */
  144. int GetInt(char * prompt)
  145. {
  146.     char s[132];
  147.     int result,done,status;
  148.     done = False;
  149.     while (!done) 
  150.     {
  151.         printf("%s ",prompt);
  152.         gets(s);
  153.         printf("\n");
  154.         status = sscanf(s,"%d",&result);
  155.         if ((status != 1) || (result < 0))
  156.                 printf("Please enter a valid positive integer.\n");
  157.         else
  158.             done = True;
  159.     }/* while */
  160.     return result;
  161. }
  162. /* ============= */
  163.  
  164. int GetFeedGrain(void)
  165. /* Asks the user how much grain she wants to feed her people, 
  166.     verifies that this is a legal value and returns with it. */
  167. {
  168.     int grain,done;
  169.     
  170. #if AO
  171. grain = People *GRAINperMAN;
  172. if (grain> StoredGrain) 
  173.     grain = StoredGrain /2;
  174. printf("Feeding people %i bushels (%i per man).\n",grain,grain/People);
  175. #else
  176.  
  177.     done = False;
  178.     while (!done)
  179.     {
  180.         printf("\nYou have %i people and %i bushels of grain.\n",
  181.                         People,StoredGrain);
  182.  
  183.  
  184.         grain = GetInt("How many bushels do you wish to feed your people? ");
  185.         printf("\n");
  186.         if (grain>StoredGrain) 
  187.             printf("You don't have enough grain to do that!");
  188.         else
  189.             done=True;
  190.     }/* while */
  191. #endif
  192.     return grain;
  193. }
  194. /* ============= */
  195. int GetPlantAcres(void)
  196. /* Asks the user how many acres she wants to plant, 
  197.     verifies that it's a valid number and returns with it. */
  198. {
  199.     int plantland,done;
  200.     
  201. /* The pertinent equations for harvest are:
  202.     L = S * ACREperGRAIN (acres planted related to bushels of seed)
  203.     L = P * ACREperFARMER; (acres planted related to population)
  204.  
  205. Where L is land planted, P is the population and S is the bushels of seed.
  206. */
  207. #if AO
  208. plantland = Land;
  209. if (plantland > People * ACREperFARMER) 
  210.     plantland = People * ACREperFARMER;
  211. if (plantland > StoredGrain * ACREperGRAIN) 
  212.     plantland = StoredGrain * ACREperGRAIN;
  213. done=True;
  214. printf("Planting %i acres.\n",plantland);
  215. #else
  216.     done = False;
  217.     while (!done)
  218.     {
  219.         printf("\nYou have %i acres, %i bushels in storage and %i farmers.\n ",
  220.                         Land, StoredGrain,People);
  221.         plantland =GetInt("How much land would you like to plant?");
  222.         printf("\n");
  223.         if (plantland > Land) /* not enough land */
  224.             printf("You don't have enough land!\n");
  225.         else if (plantland / ACREperGRAIN > StoredGrain) /* not enough grain */
  226.             printf("That would take %i bushels and you don't have that much.\n",
  227.                             plantland/ACREperGRAIN);
  228.         else if (plantland / ACREperFARMER  > People) /* not enough farmers */
  229.             printf("That would take %i farmers and you don't have that many.\n",
  230.                         plantland/ACREperFARMER);
  231.         else
  232.             done = True; /* whew! a legal number! */
  233.     }/* while */
  234. #endif
  235.     return plantland;
  236. } /* GetPlantAcres */
  237. /* ============= */
  238. int GetTradeLand(int price)
  239. /* Asks the user how much land she wants to trade, verifies that 
  240.     this is a legal value and returns with it. A negaive return value 
  241.     indicates the amount of land  sold. */
  242. {
  243.     int tradeland,done,result,surplus;
  244. #if AO
  245. surplus = StoredGrain - ((GRAINperMAN + ACREperFARMER/ACREperGRAIN)*People);
  246. tradeland = surplus/price;
  247. if (tradeland>=0) 
  248.     printf("Bought %i acres.\n",tradeland);
  249. else
  250.     printf("Sold %i acres.\n",-tradeland);
  251. #else
  252.     done = False;
  253.     while (!done)
  254.     {
  255.         printf("\nLand is selling for %i bushels per acre and you have %i ",
  256.                     price,StoredGrain);
  257.         printf("bushels in storage.\n");
  258.         tradeland = GetInt("How many acres do you wish to buy? ");
  259.  
  260.  
  261.         printf("\n");
  262.         if (tradeland == 0)
  263.         {
  264.                 tradeland = GetInt("How many acres do you wish to sell? ");
  265.                 if (tradeland > Land)
  266.                     printf("You don't have that much land!\n");
  267.                 else
  268.                 {
  269.                     done = True;
  270.                     tradeland = -tradeland;
  271.                 }
  272.         }/* not buying land */
  273.         else if (tradeland > StoredGrain/price) 
  274.             printf("You don't have enough grain for that!\n");
  275.         else 
  276.             done = True;
  277.  
  278.     }/* while */
  279. #endif
  280.     return tradeland;
  281. } /* GetTradeLand() */
  282. /* ============= */
  283. void Report(void)
  284. /* this routine tells the player her status at the beginning of 
  285.     the turn.  This information includes:
  286. Year, starved, newbies, People, Land, yield, StoredGrain, lostgrain */
  287. {
  288.     printf("\nHamurabi:  I beg to report to you, \n");
  289.     printf("in year %i, %i people starved, %i came to the city,\n",
  290.             Year,starved,newbies);
  291.     printf("the population is now %i.\n",People);
  292.     printf("The city now owns %i acres.\n",Land);
  293.     printf("You harvested %i bushels per acre.\n",yield);
  294.     printf("Rats ate %i bushels.\n",lostgrain);
  295.     printf("You now have %i bushels in store.\n",StoredGrain);
  296. }
  297. /* ============= */
  298. void Impeach(void)
  299. /* */
  300. {
  301.     printf("\n\n");
  302.     printf("You starved %i people in one year!!!\n",starved);
  303.     printf("Due to this extreme mismanagement you have not only\n");
  304.     printf("been impeached and thrown out of office but you have");
  305.     printf("also been declared national FINK!!!");
  306.     quit = True;
  307. }
  308. /* ============= */
  309. int RandRng(int Range)
  310. {
  311.     #define MaxRandom 0X7FFF
  312.     long Rand,Temp;
  313.     int Return;
  314.     Rand = (long)Random() & MaxRandom;
  315.     Return = (int)((Rand*Range)/MaxRandom)+1; /* convert it to the range */
  316.     if (Return>Range) Return = Range;
  317.     return Return;
  318. }    
  319. /* ============= */
  320. main(void)
  321. {
  322. int i,rnd,PerCap,TotScore;
  323. long count [101];
  324. long tot;
  325.     InitGame();
  326.  
  327.     printf("THE GAME OF HAMURABI \n");
  328.     printf("Creative Computing   Morristown, New Jersey\n");
  329.     printf("from Basic Computer Games by David Ahl\n");
  330.     printf("Converted to 'C' by Dave Menconi\n");
  331.     printf("Ported to CodeWarrior by Paul Celestin\n\n");
  332.     printf("\nTry your hand at running ancient Sumeria for a 10 year\n");
  333.     printf("term.  Maybe you will get lucky and live in history forever.\n");
  334.     printf("Then again, maybe not.\n\n");
  335.  
  336.     for (Year = 1; Year <= 10 && !quit; Year++)
  337.     {
  338.         Report();
  339.  
  340.         landcost = CalcLandPrice();
  341.         landtraded = GetTradeLand(landcost);
  342.         Land += landtraded;
  343.         StoredGrain -= landtraded*landcost;
  344.  
  345.         feedgrain = GetFeedGrain();
  346.         StoredGrain -= feedgrain;
  347.  
  348.         plantacre = GetPlantAcres();
  349.         plantgrain = plantacre/ACREperGRAIN;
  350.         StoredGrain -= plantgrain;
  351.         
  352.         starved = CalcStarved(feedgrain);
  353.         if (starved>People*STARVELIMIT/100)
  354.         {
  355.             Impeach();
  356.             break;
  357.         }
  358.         TotalDeath += starved;
  359.         /* avg # people who starve per year as a percentage */
  360.         AvgStarve = ((Year - 1) * AvgStarve + starved * 100/People)/Year;
  361.         
  362.         yield = CalcYield();
  363.         harvest = CalcHarvest(plantgrain,yield,People);
  364.         StoredGrain += harvest;
  365.         RandomEvent();
  366.         
  367.         newbies = CalcNewbies();
  368.         People = People - starved + newbies;
  369.     }/* for */
  370.     
  371.     PerCap = Land/People;
  372.  
  373.     printf("\n\nIn your 10 year term of office %i percent\n",AvgStarve);
  374.     printf("of the population starved per year on the averag. A total\n");
  375.     printf("of %i people starved during your tenure.\n",TotalDeath);
  376.     printf("You started with %i acres per person and ended with\n",
  377.                     INITLAND/INITPEOPLE);
  378.     printf("%i acres per person.\n",PerCap);
  379.     printf("\n\n");
  380.     TotScore = (PerCap-AvgStarve);
  381.     printf("Overall I would give you a %i.\n\n",TotScore);
  382.     if (TotScore<-20)
  383.         printf("You are a despicable despot! You killed off your people right and left!\n");
  384.     else if (TotScore<0)
  385.         printf("You did a poor job.  A change of career is in order!\n");
  386.     else if (TotScore<10)
  387.         printf("Not a bad score, altogether! Apply for president...\n");
  388.     else if (TotScore>10)
  389.     {
  390.         printf("This is incredible! Your mother should be very proud!\n");
  391.         printf("I recommend a career in hotel/motel management!\n");
  392.     }
  393. }/* main */
  394.